/**
 * 
 */
package epsofts.Neutron.GUI;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Vector;

import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

import epsofts.Neutron.Coup;
import epsofts.Neutron.IJoueur;
import epsofts.Neutron.Plateau;
import epsofts.Neutron.eCase;

/**
 * @version 1.0
 * @created 14-sept.-2006 22:48:07
 */
public class JoueurHumainGUI implements IJoueur
{
	public static final String LABEL = "Humain";
	public static final Boolean ENABLED = true;
	
	static final boolean bVerifCoups = false;
	static final String ABCDE = "ABCDE";
	BufferedReader	FromKeyboard	= new BufferedReader(new InputStreamReader(System.in));
	
	private NeutronGUI	_gui = null;

	static private JoueurHumainGUI singleton = null;
	
	public static JoueurHumainGUI createInstance(NeutronGUI gui)
	{
		if (singleton == null)
		{
			singleton = new JoueurHumainGUI(gui);
		}
		
		return singleton;
	}
	
	private JoueurHumainGUI(NeutronGUI  gui)
	{
			_gui = gui;
	}

	/**
	 * G�re l'interface et au final retourne un coup, celui demand� par le joueur.
	 * @param plateau
	 * @throws InterruptedException 
	 */
	public Coup Jouer(final Plateau plateau) throws InterruptedException
	{
		int iNeutronDestination, iNeutronOrigine = plateau.getNeutron(), iBilleOrigine, iBilleDestination;
		Vector<Integer>	vBilleCoord = new Vector<Integer>();

		//_gui.setPlateau(plateau);
		
		if (plateau.estUnPlateauInitial())
		{
			iNeutronDestination = plateau.getNeutron();
			_gui.m_coup.set(0, iNeutronDestination);
		}
		else
		{
			iNeutronDestination = _gui.saisieNeutronDestination();
		}
		/*
		// Tant que la position choisie n'est pas vide (elle est peut �tre incorrecte).
		do
		{
			System.out.print("Neutron Destination : ");
			iNeutronDestination = SaisiePosition();
		}while(bVerifCoups && (cases[iNeutronDestination] != eCase.VIDE));
		*/
		
		vBilleCoord = _gui.saisieBilleOrigineDestination();
		iBilleOrigine = vBilleCoord.get(0);
		iBilleDestination = vBilleCoord.get(1);
		//_gui.saisieBilleOrigineDestination();
		/*
		// Tant qu'une bille de bonne couleur n'est pas choisie
		do
		{
			System.out.print("Bille Origine : ");
			iBilleOrigine = SaisiePosition();
		}while(bVerifCoups && (cases[iBilleOrigine] != plateau.getTour()));
		
		// Tant qu'une case vide n'est pas choisie
		do
		{
			System.out.print("Bille Destination : ");
			iBilleDestination = SaisiePosition();
		}while(bVerifCoups && (cases[iBilleDestination] != eCase.VIDE) && (iBilleDestination != iNeutronOrigine));
		*/

		return new Coup((short) iBilleOrigine, (short) iBilleDestination, (short) iNeutronOrigine, (short) iNeutronDestination);
	}

	/**
	 * Doit tnterrompre le tour du joueur si celui-ci �tait en train de jouer.
	 */
	public void Stopper()
	{
		System.out.println("Stopper JoueurHumainGUI (nothing to do)");
	}
	
	/* (non-Javadoc)
	 * @see epsofts.Neutron.IJoueur#OnJeuFini(epsofts.Neutron.eCase)
	 */
	@Override
	public void OnJeuFini(eCase i_vainqueur)
	{
		// TODO Auto-generated method stub
		_gui.m_Etat = NeutronGUI.eEtat.WAIT;
		final StringBuffer sMsg = new StringBuffer("Vainqueur : ");
		switch(i_vainqueur)
		{
			case ROUGE:
			{
				sMsg.append("ROUGE");
				break;
			}
			case BLEUE:
			{
				sMsg.append("BLEU");
				break;
			}
			default:
			{
				sMsg.append("Nul");
				break;
			}
		}
		
		SwingUtilities.invokeLater(new Runnable()
		{
		
			@Override
			public void run()
			{
				JOptionPane.showMessageDialog(null, sMsg, "Fin de la partie", JOptionPane.INFORMATION_MESSAGE);
			}
		});
	}

}
